# yandex_autumn
Project task for yandex backend school autumn 2022

# Запуск приложения #

Способ 1: клонируете файл docker-compose.yml и в вашем интерпретаторе командой строки <code>docker compose up</code>. На вашем устройстве должен быть докер. Запустятся два контейнера, один с базой PostgreSQL, слушающий порт 5432, второй контейнер с приложением, слушающий порт 80.

Способ 2: локальный. Клонируете репозиторий, в директории проекта <code>gradle bootRun</code>. На вашем устройстве должна быть система сборки проектов gradle и PostgreSQL. Приложение будет работать по адресу 127.0.0.1:80.

Так же приложение развернуто на предоставленной машине от Школы Бэкенд Разработки яндекса по адресу https://zones-1883.usr.yandex-academy.ru/ согласно техническому заданию. Спецификация находится в файле <code>openapi.yaml</code> текущего репозитория.

Ниже содержится общее описание задания:

# Описание #

В данном задании вам предлагается реализовать бэкенд для веб-сервиса хранения файлов, аналогичный сервису [Яндекс Диск](https://yandex.ru/disk). Обычно взаимодействие с такими сервисами происходит следующим образом:
1. Пользователь загружает и структурирует файлы в предложенном ему облачном пространстве.
2. Пользователь может скачивать файлы и фиксировать историю их изменений.

Ваша задача - разработать REST API сервис, который позволяет пользователям загружать и обновлять информацию о файлах и папках.

# Технические требования #

Реализуйте сервис на Python, Java или C++ в зависимости от выбранного направления школы. Сервис должен удовлетворять следующим требованиям:
- реализует спецификацию API, описанную в файле <code>openapi.yaml</code>, и корректно отвечает на запросы проверяющей системы
- некоторые обработчики из них являются необязательными, их реализация позволит вам набрать дополнительное количество баллов
- сервис должен быть развернут в контейнере на адресе `0.0.0.0:80`
- сервис должен обеспечивать персистентность данных (должен сохранять состояние данных при перезапуске)
- сервис должен обладать возможностью автоматического перезапуска при рестарте контейнера, в котором работает ваш бэкенд (этого можно достичь настройкой контейнера)
- после запуска сервиса время ответа сервиса на все методы API не должно превышать 1 секунду
- время полного старта сервиса не должно превышать 1 минуту
- импорт и удаление данных не превосходит 1000 элементов в 1 минуту
- RPS (Request per second) получения истории, недавних изменений и информации об элементе суммарно не превосходит 100 запросов в секунду

## Тестирование ##

В качестве предварительного тестирования мы подготовили для вас юнит-тест <code>unit_test.py</code>, написанный на Python. Он позволит проверить минимальную работоспособность вашего бэкенда до отправки решения на проверку.

Для прохождения проверки обратите внимание на следующее:
- Коды ответа HTTP.
- Корректность JSON структуры запроса и ответа.
- Типы данных (строки, числа).
- Формат даты.
- Проведение необходмых валидаций входных данных.
- Краевые случаи.
- Формат и коды ошибок.

Рекомендуется написать свои тесты для проверки разработанной функциональности.

## Развёртывание приложения ##
На выделенном контейнере вы можете:
1. Работать с вашим приватным репозиторием.
2. Использовать средства контейнеризации, например Docker, он уже установлен.
3. Устанавливать программное обеспечение для сборки и запуска вашего приложения, используя Интернет. Например, для реализации задания на языке Java вы можете использовать Maven или Gradle. Явных требований по сборке и развертыванию приложения нет.
4. Настраивать контейнер по своему усмотрению (например, настройки автозапуска или версии Java).

## Оценивание решения ##
Оценивание решения будет проходить после отправки решения кандидатом на проверку в несколько этапов.
1. Автоматическое тестирование. Проверяющей системой будут выполнятся запросы к вашему бэкенду. Будет проверятся корректность ответов, их коды ответа HTTP и тела.
2. Ручная проверка решения проверяющими Школы бэкенд-разработки. Будут учитываться различные особенности вашего решения:
   - Способ решения.
   - Качество решения.
   - Возможность обработки нескольких запросов сервисом одновременно.
   - Покрытие тестами.
   - Документация описывающая код, сборку, запуск и работу приложения.

# Полезные материалы #
1. Подробнее про спецификацию OpenAPI вы можете узнать здесь [Спецификация OpenAPI](https://swagger.io/specification/)
2. [Практическое руководство по разработке бэкенд-сервиса на Python](https://habr.com/ru/company/yandex/blog/499534/)
3. Как реализовать автозапуск программы при рестарте контейнера вы можете узнать в [Практическом руководстве по разработке бэкенд-сервиса на Python](https://habr.com/ru/company/yandex/blog/499534/) в разделе "Деплой".
4. [Визуализация файла спецификации Open API](https://editor.swagger.io)
5. [Автозапуск сервера при рестарте контейнера](https://habr.com/ru/company/southbridge/blog/255845/)

# FAQ #
**Как обратиться к моему приложению с рабочего компьютера?**

Как и проверяющая система, вы можете сделать запрос по адресу <code>https://hostname.usr.yandex-academy.ru</code> для проверки своего решения, где hostname - это название вашего контейнера (можно получить войдя в контейнер).

**Как подключиться к базе данных внутри моего контейнера?**

Вы можете развернуть требуемую базу данных внутри Docker (или другой программы для контейнеризации) или на выданном вам контейнере. В качестве примера вы можете изучить статью на [Habr](https://habr.com/ru/post/578744/) , рассказывающую о развёртывании PostgreSQL в Docker контейнере
